package o2o.company.model;

import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import com.jinyou.utils.common.ValidateUtil;
import lombok.Data;
import lombok.experimental.Accessors;
import o2o.dao.PO.shop.ShopCommentInfo;
import o2o.dao.VO.shop.ShopInfoVO;
import o2o.task.image.ImageService;
import org.springframework.beans.BeanUtils;

import javax.persistence.*;
import java.util.Objects;

//店铺信息
@Data
@Accessors(chain = true)
@TableName("shop_info")
public class ShopInfo {
    private Long id;                    // ID
    private String shopName;            // 店铺名称
    private Integer shopRole;           //  店铺类型(用途)  1.正常店铺  2. 品牌内页  11.非直营店铺
    private Integer isIntegralShop = 0; // 是否有积分商城
    private String telephone;           // 店铺电话
    private String address;             // 店铺地址
    private String descs;               // 店铺说明
    private Integer shopCategory;       // 商家类型 1<<0 外卖商家 1<<1 团购商家
    private Integer cloudShopType = 1;  // 商家类型 1 普通商家 2 云商品提供商家 4 创业广场商家
    private String imageUrl;            // 店铺头像
    @TableField(exist = false)
    private String imageThumbnailUrl;   // 店铺头像 缩略图
    private String imageUrlB;           // 店铺背景图
    private String recomImageUrl;       // 推荐图片
    private String imageUrlBig;         // 店铺头像大图
    private String affiche;             // 店铺公告
    private Double lng;                 // 经度
    private Double lat;                 // 纬度
    private String geocode;             // GeoHash码
    private Long areaPoint;             // 区域  获取附近店铺用
    @TableField(exist = false)
    private Long areaLong;              //距离
    @TableField(exist = false)
    private Double distinct;            //距离
    private String province;            // 所属省份
    private String city;                // 所属城市
    private String county;              // 所属区县
    private String cityEN;              // 所属城市
    private String region;              //所属商圈

    @TableField(exist = false)
    private Long agentId;               //所属商圈
    private String ownUsername;         // 店主帐号
    private String ownName;             // 店主名称
    private String alipay;              // 店铺支付宝帐号
    private String alipayRealName;      // 店铺支付宝对应的真实姓名
    private String tenpay;              // 店铺微信帐号
    private String tenpayopenId;        // 店铺微信帐号openId
    private Long closeDate;             // 被关闭的时间
    private Double startFree;           // 起送费
    private Double yunfei;              // 运费
    private Double packetPrice;         //打包费
    private Integer hasCanJu;           //是否提供餐具 0不提供，1提供按订单收费，2按餐具数量收费
    private Double canJuPrice;          //餐具费用（1单或1套）
    private Double freeYunFei;          //满足金额减配送费（需大于0才免）
    private Double freeYunFeiMoney;     //满足金额减配送费金额 -1时为免配送费
    private Double freeYunFeiShop;      //满足金额减配送费,商家承担部分
    private String workDate;            //营业日期
    private String worktime;            // 营业时间
    private String deliveryWorkDays;    // 配送工作日
    private String applyTime;           //接单时间
    private Integer appointmentDate;    //到店 可预约天数(到店消费类店铺，用户可预约最多多少天后)
    private String appointmentTime;     //到店 可预约时段
    private Integer appointAfterDate;   //可配送 最大天数（用户最多可以预约几天后的配送的订单）
    private String appointAfterTime;    //可预约 配送时段
    private Long expectDeliveryTime;    // 预计送达所需时间 （以毫秒计算）
    private Integer isCashOnDelivery;   // 是否支持货到付款 0 : 不支持 1： 支持货到付款
    private String autoApplyTime;       //消费自动确认时间(用户在预约时间到达后，自动确认消费)
    private int isPeiSong;              //是否为配送类店铺  1支持配送  0不支持到店
    private int isDaoDian;              //是否为到店消费类店铺 1支持到店  0不支持到店  2支持到店堂食
    private int topFineType = 0;        // 好店的类型
    private int isRecommend;            // 是否为推荐 0:不推荐,1:推荐
    private int isRecommend2;           // 团购推荐
    private int isPreference;           // 是是优选商家// （1优选，0非优选）
    private int isPreference2;           // 是是优选商家// （1优选，0非优选）
    private int isAppointment;          // 是否提供预约服务 0:不提供,1:提供
    private int isWork;                 // 是否上班中 0:已打烊 1:营业中
    private int isOpen;                 // 关闭状态 0:关闭,1:正常
    private int isLock;                 // 是否锁定 0:锁定,1:正常
    private int isBill;                 // 是否可以开发票（0，不能，1，可以）
    private Integer isJoinVipGame;      // 是否参加vip 会员活动 0 不参加 1 参加
    private Integer isSeriesSale;       // 是不是批发（0不批发，1批发,2 校内商家）
    private int isNewOpen;              // 是不是新开业的店铺（0不是，1是）
    private Integer isSelfPost;         //店铺是否为自配送（自配送的订单不需要推送给配送员） 0平台派送  1自配送
    private Integer canZhiYou;          // 是否支持直邮   0普通商家，1超出配送范围可以邮寄
    private Integer isGroupShop;        // 是不是团购商家 0 不是 1是  2 即是0也是1 // 要废弃
    private Integer hasMulCategory;        // 商品分类是否有多级  0只有一级，1有多级
    private Integer isSupportMuchShopOrder; // 是否支持多商户同时下单 0 不支持  1 支持
    private int autoClose;              // 自动打烊 0:自动,1:手动
    private int autoApply;              // 自动接单 0:自动,1:手动
    private Integer autoPrint;          // 自动打印 0:否,1:自动打印
    private Integer autoApplyBySys;     // 系统自动替商家接单 （即用户支付完成后，自动成为商家已接单）  1需要  0不需要
    private Integer needCall;           // 不接单时需要电话通知  1需要  0不需要
    private Integer registerShopState = 0; // 0 未申请  1 成功 -2 更新门店失败 -1 申请门店失败 哒哒对接申请门店
    private Long manualWorkTime;        // 最后一次手动更新上下班时间
    private String businessUsername;    //业务员账号
    private String cityAdmin;           //代理账号
    private Double moneyRate;           // 分成比例  最大为100  百分比制
    private Double minCharge;           // 最低抽成金额
    private Double ziQuShareRate;            // 自取订单分成比例 百分比
    private Double ziQuAwardRate;            // 自取订单优惠比例  例如 20 则 支付金额 减少20%
    private Double workerRate;          // 店铺工人分成比例
    private Double plateDrawGoodMoney;  // 平台每个商品抽多少钱plateDrawGoodMoney
    private Double sharerShareRate;     // 分享者分成比例
    private Double fixedCost;           // 按单店铺计算：配送固定费用
    private Double withinDistance;//距离 ：店铺配送指定距离以内 只收取固定费用
    private Double oneKmCost;// 超出固定距离费用
    private Integer settlementType; // 账单类型0  使用商圈设置 1 日结 3 三日结 7 周结  30 月结
    private Long lastSettlementTime;    // 最后一次结算日
    private Double fixedWeightCost; //固定重量内价格
    private Double withinWeight;     // 固定重量内
    private Double oneKgWeightCost;  // 超出后每kg多少钱
    private Double plateSharePacketRate = 0.0D;  // 平台打包费分成比例  默认为0 不分成
    private Integer shopTaxRate; // 店铺税率
    private Integer orderCounts;// 完成交易的订单量
    private Double score;// 评分
    private Integer star;//星级
    @TableField(exist = false)
    private ShopCommentInfo commentInfo;//店铺评论信息
    private String shopNameLang;// 店铺名称
    private String addressLang;// 店铺地址
    private String ownNameLang;// 店主名称
    private String descsLang;// 店铺说明
    private String afficheLang;// 店铺公告
    private String lnglats;// 店铺地址
    private String lnglats1;// 范围较大的配送地址
    private String lnglats2;// 范围较小的配送地址
    private String foodSafeLevel;//食品安全等级
    private String terminal; // 窗口编号
    private int pageVersion;//控制商品商品展示列数
    private String vrUrl;// vr地址
    private Long applyShopTime;             // 申请商家时间
    private int delFlag;// 是否已删除(0未删除,1已删除)
    private String createUser;// 创建者
    private long createTime;// 创建日期 141231212423423时间戳毫秒级标识
    private String updateUser;// 最后更新着
    // private long updateTime;// 最后更新时间
    private Long orderNo;// 排序编号
    private Integer imgUpVer;// 图片版本
    @TableField(exist = false)
    private Integer thumbnailState;// 缩略图版本
    /**
     * 品牌名称
     */
    @TableField("brand_name")
    private String brandName;
    /**
     * 所属商家
     */
    @TableField("company_id")
    private String companyId;

    /**
     * 经营品类
     */
    @TableField("business_category")
    private String businessCategory;

    /**
     * 配送主管
     */
    @TableField("supervisor_id")
    private Long supervisorId;

    /**
     * 高峰时段 JSON字符串
     */
    @TableField("peak_time_bucket")
    private String peakTimeBucket;

    /**
     * 基础用时
     */
    @TableField("base_hour")
    private String baseHour;

    /**
     * 高峰用时
     */
    @TableField("peak_hour")
    private String peakHour;

    /**
     * 单量保底状态
     */
    @TableField("order_guarantee_status")
    private String orderGuaranteeStatus;

    /**
     * 单量保底
     */
    @TableField("order_guarantee")
    private String orderGuarantee;

    /**
     * 配送费用类型 1固定  2按单量收费  3按距离收费
     */
    @TableField("delivery_fee_type")
    private String deliveryFeeType;

    /**
     * 配送费用
     */
    @TableField("delivery_fee")
    private String deliveryFee;

    /**
     * 配送费用 标准费用, 当配送费用类型为2按单量收费时使用
     */
    @Column(name = "delivery_standard_fee")
    private String deliveryStandardFee;

    /**
     * 夜间加价 0不启用 1启用
     */
    @TableField("night_price_type")
    private String nightPriceType;

    /**
     * 夜间加价 长度为3的数组 xx 至 xx, 每单加收 xx 元
     */
    @TableField("night_price")
    private String nightPrice;

    /**
     * 派单规则 1 系统派单 2 抢单
     */
    @TableField("send_order_rule")
    private String sendOrderRule;

    /**
     * 骑手可同时接单数
     */
    @TableField("postman_max_order")
    private String postmanMaxOrder;

    /**
     * 每日最多可转单数
     */
    @TableField("max_reorder_per_day")
    private String maxReorderPerDay;

    /**
     * 即将超时前，提前多少分钟提醒骑手
     */
    @TableField("timeout_remind")
    private String timeoutRemind;

    /**
     * 要求送达时间大于多少分钟时，订单为预订单
     */
    @TableField("advance_order_gt_time")
    private String advanceOrderGtTime;

    /**
     * 预订单提前多少分钟推送给骑手
     */
    @TableField("advance_order_push_time")
    private String advanceOrderPushTime;

    /**
     * 第三方配送是否开启 0未开启 1开启
     */
    @Column(name = "third_party_type")
    private String thirdPartyType;

    /**
     * 第三方配送的条件，达到多少公里，派给第三方
     */
    @Column(name = "third_party_cond")
    private String thirdPartyCond;

    /**
     * 第三方配送公司
     */
    @Column(name = "third_party")
    private String thirdParty;

    /**
     * 蜂窝ID
     */
    private Long honeycomb_id;

    @Override
    public boolean equals(Object obj) {
        if (obj instanceof ShopInfo) {
            ShopInfo obj02 = (ShopInfo) obj;
            return this.getId().longValue() - obj02.getId().longValue() == 0;
        }
        return super.equals(obj);
    }

    @Override
    public int hashCode() {
        return Objects.hash(id);
    }

    public ShopInfoVO convert2VO() {
        ShopInfoVO shopInfoVO = new ShopInfoVO();
        BeanUtils.copyProperties(this, shopInfoVO);
        if (ValidateUtil.isNotNull(shopInfoVO.getImageUrl()) && ValidateUtil.isNotNetUrl(shopInfoVO.getImageUrl())) {
            String thumb = ImageService.getThumbnailImgUrl(shopInfoVO.getImageUrl(), this.imgUpVer, this.thumbnailState);
            shopInfoVO.setImageThumbnailUrl(thumb);
//            shopInfoVO.setImageUrl(SYS_CONFIG_PATH.IMAGE_BASE_URL + shopInfoVO.getImageUrl());
            shopInfoVO.setImageUrl(ImageService.getImgUrl(this.imgUpVer) + shopInfoVO.getImageUrl());
        }
        return shopInfoVO;
    }

}
